package db

import (
	log "github.com/sirupsen/logrus"
	"src/db/db_modle"
	"src/error_msg"
	"src/tools"
)

// 获取用户信息
func GetUsersInfo(uid uint) (db_modle.Users, error) {
	orm := GetMysqlOrm()
	defer orm.Close()
	var user db_modle.Users
	result := orm.Where("id = ?", uid).Find(&user)
	if e := result.Error; e != nil {
		log.Error(e.Error())
		return db_modle.Users{}, e
	}
	return user, nil
}

// 通讯录贷款人数
func GetNumOfContactsLoaned(uid uint, logId string) (int, error) {
	bd := GetUsersDetails(uid)
	if len(bd) == 0 {
		ne := error_msg.InformationNotFoundError
		log.Error(ne.Error(), logId)
		return 0, error_msg.InformationNotFoundError
	}
	orm := GetMysqlOrm()
	defer orm.Close()
	var count int
	user := make([]db_modle.Users, 0)
	contacts := make([]string, 0)
	// RemoveDuplicateContacts
	RDContacts := make(map[string]int)
	for _, v := range bd {
		// 用户每一条记录中的通讯录联系人map[string],k为电话
		m, e := tools.ParseContactsStr(v.AddressBookContent)
		if e != nil {
			log.Error(e.Error(), logId)
			return 0, e
		}
		// 拿到去重后的通讯录
		contacts = append(contacts, m...)
		RDContacts = tools.RemoveDuplicate(contacts)
	}

	// 遍历通讯录产看已经贷款的人数
	for k := range RDContacts {
		// 通讯录中各个联系人电话
		result := orm.Where("phone = ?", k).Where("is_loan != ?", 1).Find(&user)
		if e := result.Error; e != nil {
			log.Error(e.Error(), logId)
			return 0, e
		}
		if result.RowsAffected > 0 {
			count ++
			log.Debugf("用户通讯录中已经贷款的联系人 %+v \n", user)
		}
	}
	return count, nil
}

// 通讯录贷款逾期人数
func GetNumOfContactsOverdue(uid uint, logId string) (int, error) {
	bd := GetUsersDetails(uid)
	if len(bd) == 0 {
		ne := error_msg.InformationNotFoundError
		log.Error(ne, logId)
		return 0, ne
	}
	orm := GetMysqlOrm()
	defer orm.Close()
	var count int

	contacts := make([]string, 0)
	// RemoveDuplicateContacts
	RDContacts := make(map[string]int)
	for _, v := range bd {
		// 用户每一条记录中的通讯录联系人map[string],k为电话
		m, e := tools.ParseContactsStr(v.AddressBookContent)
		if e != nil {
			log.Error(e.Error(), logId)
			return 0, e
		}
		// 拿到去重后的通讯录
		contacts = append(contacts, m...)
		RDContacts = tools.RemoveDuplicate(contacts)
	}

	// 遍历通讯录产看已经贷款的人数
	for k := range RDContacts {
		user := db_modle.Users{}
		// 通讯录中各个联系人电话
		res := orm.Where("phone = ?", k).First(&user)
		if e := res.Error; e != nil {
			// 未注册的用户没有电话，查不到跳过
			continue
		}
		// pay表中uid和review_type,获取借到钱的人订单id
		var orderIds []db_modle.Pay
		// review_type=1 已贷款
		r := orm.Where("user_id = ?", user.Id).Where("review_type = ?", 1).Find(&orderIds)
		if e := r.Error; e != nil {
			log.Error(e.Error(), logId)
			return 0, e
		}
		// repayment中订单id获取对应的also_time, 与越南当地时间比对
		repayment := db_modle.Repayment{}
		for _, v := range orderIds {
			s := orm.Where("order_id = ?", v.OrderId).Where("repayment_status != ?", 3).First(&repayment)
			if e := s.Error; e != nil {
				// 未查询到，不能影响其他订单的查询
				continue
			}
			// 逾期
			if repayment.AlsoTime.Unix() < tools.GetVietnamTime().Unix() {
				count ++
				log.Debugf("用户通讯录中贷款逾期的联系人 %+v \n", user)
			}
		}
	}
	return count, nil
}
